;
/**
 * 校验成功后以json方式提交表单<br>
 * 
 * $("#formId").postJsonOnValid(function(data){...});
 * 
 * $("#formId").postJsonOnValid({ "serialize":serializeCallback,
 * "post":postCallback });
 * 
 */
(function($) {
	"use strict";

	// 创建一个警告框的HTML，用于嵌入到适当的容器进行显示
	// $.alert( { style: "info", title: "the-title", msg: "the-msg" } );
	$.alert = function(opt) {
		var style = opt.style ? opt.style : "info";
		var title = opt.title ? opt.title : false;
		var msg = opt.msg ? opt.msg : false;
		var s = [];
		s[s.length] = '<div class="alert alert-dismissible alert-' + style + '">';
		s[s.length] = ' <button type="button" class="close" data-dismiss="alert">×</button>';
		s[s.length] = title ? '<h4>' + title + '</h4>' : '';
		s[s.length] = msg ? msg : '';
		s[s.length] = '</div>';
		return $(s.join(""));
	};

	// 重置并初始化表单
	$.fn.reset = function(jsonObj) {
		if (!$(this).is("form")) {
			// 非表单不处理
			return;
		}

		// 重置表单
		$(this).get(0).reset();
		// 更新 icheck 控件状态
		$("input.icheck", this).iCheck("update");
		// 没有传实体json，不执行属性值绑定
		if (!jsonObj) {
			return;
		}

		// 定义表单实体供下级闭包使用
		var form = $(this);
		// 工具函数，用于将数组元素强转成字符串元素
		var _asStringArray = function(v) {
			return "" + v;
		};
		// 遍历 json 实体的每个属性
		$.each(jsonObj, function(key, val) {
			var input = $(":input[name=" + key + "]", form);
			// 没有对应的控件
			if ($(input).size() == 0) {
				return;
			}
			// 单行文本框、隐藏input、多行文本框
			if ($(input).is(":text") || $(input).is("[type=hidden]") || $(input).is("textarea")) {
				$(input).val(val);
				return;
			}
			// 下拉列表或多选列表
			if ($(input).is("select")) {
				$("option", input).each(function() {
					this.selected = $.isArray(val) ? ($.inArray(this.value, $.map(val, _asStringArray)) >= 0) : (this.value == val);
				});
				return;
			}
			// 复选框和单选钮 .icheck
			if ($(input).is(".icheck")) {
				$(input).each(function(i) {
					var checked = false;
					if ((typeof val) == (typeof true)) {
						// 布尔值
						checked = val;
					} else {
						// 非布尔值
						checked = $.isArray(val) ? ($.inArray(this.value, $.map(val, _asStringArray)) >= 0) : (this.value == val);
					}
					$(this).iCheck(checked ? "check" : "uncheck");
				});
			}
		});
	}

	// 验证通过后，以 ajax json 方式提交表单
	$.fn.postJsonOnValid = function(options) {
		var serializeCallback = options["serialize"];
		var postCallback = options["post"];
		$(this).on("valid.form", function(e) {
			var data = $(this).serializeJSON();
			if (serializeCallback && serializeCallback(data) === false) {
				return;
			}
			data = JSON.stringify(data);
			var url = $(this).attr("action");
			$.post(url, data, postCallback);
		});
	};

	$.fn.ajaxGetOnValid = function(options) {
		var serializeCallback = options["serialize"];
		var completeCallback = options["complete"];
		$(this).on("valid.form", function(e) {
			var data = $(this).serializeJSON();
			if (serializeCallback && serializeCallback(data) === false) {
				return;
			}
			var url = $(this).attr("action");
			$.get(url, data, completeCallback);
		});
	};

	// 行 hover 显隐 .hover-show 按钮
	$.fn.rowHoverShow = function() {
		$("tr", this).bind("mouseover", function(event) {
			$(".hover-show", this).show();
		});

		$("tr", this).bind("mouseout", function(event) {
			$(".hover-show", this).hide();
		});
	};

	// 单元格 hover 显隐 .hover-show 按钮
	$.fn.cellHoverShow = function() {
		$("td,th", this).bind("mouseover", function(event) {
			$(".hover-show", this).show();
		});

		$("td,th", this).bind("mouseout", function(event) {
			$(".hover-show", this).hide();
		});
	}

})(jQuery);

/**
 * 初始化一些默认设置
 */
$(function() {

	$("form").attr("autocomplete", "off");

	// 设置 DataTable 的默认样式
	$.extend($.fn.dataTable.defaults, {
		searching : false,
		ordering : false,
		paging : false,
		info : false,
		oClasses : {
			"sTable" : "dataTable display cell-border"
		}
	});

	// 设置全局的 ajax 请求与期望数据类型为 json，并设置全局错误提示
	$.ajaxSetup({
		contentType : "application/json; charset=utf-8",
		dataType : "json",
		error : function(request, textStatus, errorThrown) {
			// 如果发生了错误，textStatus 除了得到null之外，
			// 还可能是 timeout, error, notmodified 和 parsererror
			if (textStatus == "timeout") {
				alert(this.url + " 请求超时！");
				return;
			}
			if (textStatus == "error" && request.responseJSON) {
				alert(this.url + " " + request.responseJSON.msg);
				return;
			}
			alert(this.url + " 未知错误！");
		}
	});

	// 扩展验证控件的主题：yellow_bottom
	var TPL_ARROW = '<span class="n-arrow"><b>◆</b><i>◆</i></span>';
	$.validator.setTheme({
		"yellow_bottom" : {
			formClass : "n-yellow",
			msgClass : "n-bottom",
			msgArrow : TPL_ARROW
		}
	});
	$.validator.config({
		"theme" : "yellow_bottom",
		"focusInvalid" : true
	});

});